package main

import (
	"fmt"
	"math/rand"
	"time"
)

func main() {
	list := []int{1,2,3}
	s := Constructor(list)
	r1 := s.Shuffle()
	fmt.Println(r1 )
	r2 := s.Reset()
	fmt.Println(r2)
	r3 := s.Shuffle()
	fmt.Println(r3)

}
/*
打乱一个没有重复元素的数组。

示例:

// 以数字集合 1, 2 和 3 初始化数组。
int[] nums = {1,2,3};
Solution solution = new Solution(nums);

// 打乱数组 [1,2,3] 并返回结果。任何 [1,2,3]的排列返回的概率应该相同。
solution.shuffle();

// 重设数组到它的初始状态[1,2,3]。
solution.reset();

// 随机返回数组[1,2,3]打乱后的结果。
solution.shuffle();

来源：力扣（LeetCode）
链接：https://leetcode-cn.com/problems/shuffle-an-array
著作权归领扣网络所有。商业转载请联系官方授权，非商业转载请注明出处。
*/

type Solution struct {
	list []int
	listBackup []int
}

func (s *Solution)Pop() int{
	index := rand.Intn(len(s.list))
	num := s.list[index]
	s.list[len(s.list)-1],s.list[index] = s.list[index],s.list[len(s.list)-1]
	s.list = s.list[:len(s.list)-1]
	return num
}

func Constructor(nums []int) Solution {
	list := make([]int,len(nums))
	copy(list,nums)
	s := Solution{
		list:nums,
		listBackup:list,
	}

	return s
}


/** Resets the array to its original configuration and return it. */
func (this *Solution) Reset() []int {
	return this.listBackup
}


/** Returns a random shuffling of the array. */
func (this *Solution) Shuffle() []int {

	if len(this.list) == 0{
		l := make([]int,len(this.listBackup))
		copy(l,this.listBackup)
		this.list = l
	}
	list := make([]int,len(this.list))
	for i := 0 ;i<len(list);i++{
		list[i] = this.Pop()
	}
	return list
}
func init()  {
	rand.Seed(time.Now().Unix())
}